using KinonekoSoftware.CodariaDB.Documents.Index;

namespace KinonekoSoftware.CodariaDB.Documents.Templates
{
    partial class TemplateEngine
    {
        /// <summary>
        /// 判断是否存在指定名字的设定模板。
        /// </summary>
        /// <param name="name">指定的模板名字。</param>
        /// <returns>返回一个值，如果为true则表示存在，否则为false。</returns>
        public bool HasTemplate(string name) => ModuleCacheDB.HasName(name);

        /// <summary>
        /// 为指定的设定类型，添加一个设定模板。
        /// </summary>
        /// <param name="template">要添加的设定模板。</param>
        /// <param name="type">指定要添加的设定类型。</param>
        public void AddTemplate(ModuleTemplate template, InstanceType type)
        {
            if (template is null)
            {
                return;
            }

            if (!ModuleCacheDB.HasID(template.Id))
            {
                ModuleCacheDB.Insert(new ModuleTemplateCache
                {
                    Id   = template.Id,
                    Name = template.Name,
                    Type = type,
                });
            }


            if (!ModuleTemplateDB.HasID(template.Id))
            {
                ModuleTemplateDB.Insert(template);
            }
        }

        /// <summary>
        /// 更新设定模板。
        /// </summary>
        /// <param name="id">设定模板ID。</param>
        /// <param name="name">模板名字。</param>
        public void UpdateTemplate(string id, string name)
        {
            var cache    = ModuleCacheDB.FindById(id);
            var template = ModuleTemplateDB.FindById(id);

            if (cache is not null)
            {
                cache.Name = name;
                ModuleCacheDB.Update(cache);
            }

            if (template is not null)
            {
                template.Name = name;
                ModuleTemplateDB.Update(template);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        public void RemoveTemplate(string id)
        {
            ModuleTemplateDB.Delete(id);
            ModuleCacheDB.Delete(id);
        }
        
        /// <summary>
        /// 
        /// </summary>
        /// <param name="cache"></param>
        /// <returns></returns>
        public ModuleTemplate GetTemplate(ModuleTemplateCache cache)
        {
            return ModuleTemplateDB.FindById(cache.Id);
        }
        
        /// <summary>
        /// 
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public IEnumerable<ModuleTemplateCache> GetTemplates(InstanceType type)
        {
            return ModuleCacheDB.Find(x => x.Type == type);
        }
        
    }
}